package edu.cgpi.core.entidade.grafico;

import java.awt.Color;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamOmitField;

import edu.cgpi.core.entidade.Cor;
import edu.cgpi.core.entidade.Ponto;
import edu.cgpi.core.entidade.Reta;
import edu.cgpi.core.entidade.RetaPoligonal;
import edu.cgpi.core.util.Normalizador;

@XStreamAlias("LinhaPoligonal")
public class RetaPoligonal2D extends RetaPoligonal implements Imagem {

	@XStreamAlias("Cor")
	private Cor cor;
	@XStreamOmitField
	private boolean finalizada;
	@XStreamOmitField
	private boolean selecionada;

	public RetaPoligonal2D(List<Ponto> pontos) {
		super(pontos);
		this.cor = new Cor(Color.BLACK);
		this.finalizada = false;
		this.selecionada = false;
	}

	public RetaPoligonal2D(List<Ponto> pontos, Cor cor) {
		super(pontos);
		this.cor = cor;
		this.finalizada = false;
		this.selecionada = false;
	}

	public Cor getCor() {
		if (estaSelecionada())
			return new Cor(Color.WHITE);
		else
			return cor;
	}

	public void setCor(Cor cor) {
		this.cor = cor;
	}

	public void setFinalizada(boolean b) {
		finalizada = b;
	}
	
	public boolean estaSelecionada() {
		return selecionada;
	}

	@Override
	public Set<Ponto> obterPontos() {
		Set<Ponto> pontosObtidos = new HashSet<Ponto>();
		if (getPontos().size() > 1) {
			Iterator<Ponto> it = getPontos().iterator();
			Ponto pontoInicial = it.next();
			Ponto pontoAtual = pontoInicial;
			Ponto pontoSeguinte = null;
			while (it.hasNext()) {
				pontoSeguinte = it.next();
				pontosObtidos.addAll(new Reta(pontoAtual, pontoSeguinte)
						.obterPontos());
				pontoAtual = pontoSeguinte;
			}
		}
		else
			pontosObtidos.addAll(getPontos());
		return pontosObtidos;
	}

	public boolean estaFinalizada() {
		return finalizada;
	}

	public void atualizar(Ponto ponto) {
		getPontos().remove(getPontos().size() - 1);
		getPontos().add(ponto);
	}

	@Override
	public Imagem normalizar() {
		List<Ponto> pontosNorm = new ArrayList<Ponto>();
		for (Ponto ponto : getPontos()) {
			pontosNorm.add(Normalizador.normalizar(ponto));
		}
		return new RetaPoligonal2D(pontosNorm, getCor());
	}

	@Override
	public Imagem expandir() {
		List<Ponto> pontosNorm = new ArrayList<Ponto>();
		for (Ponto ponto : getPontos()) {
			pontosNorm.add(Normalizador.desnormalizar(ponto));
		}
		return new RetaPoligonal2D(pontosNorm, getCor());
	}
}